﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntitiesLayer;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
using System.IO;
using DAL.Repositorios;

namespace DAL.Repositorios
{
    public class FuncionarioRepository : DAL.Repositorios.IRepositoryConsultar<Funcionario>
    {




        public IEnumerable<Funcionario> GetAll()
        {

            DataSet ds = UsuarioManRepository.GetDataSetGenerico('F', DBNull.Value);

            foreach (DataRow dr in ds.Tables[0].Rows)
                yield return crearFuncionario(Convert.ToInt32(dr["IdUsuario"]), dr);


        }

        public Funcionario GetById(int id)
        {
            Funcionario objFuncionario = null;
            DataSet ds = UsuarioManRepository.GetDataSetGenerico('F', id);

            foreach (DataRow dr in ds.Tables[0].Rows)
                objFuncionario  = crearFuncionario(id, dr);


            return objFuncionario;

        }

        internal static Funcionario crearFuncionario(int id, DataRow dr)
        {

            
         
            object foto= dr["Foto"];
            Rol rol = RolRepository.crearRol(Convert.ToInt32(dr["IdRol"]), dr);

            Funcionario objFuncionario = new Funcionario(
                idUsuario: id,
                identificacion: dr["Identificacion"].ToString(),
                nombre: dr["Nombre"].ToString(),
                PApellido: dr["PApellido"].ToString(),
                SApellido: dr["SApellido"].ToString(),
                fechaNacimiento: Convert.ToDateTime(dr["FechaNacimiento"]),
                fechaIngreso:Convert.ToDateTime(dr["FechaIngreso"]),
                genero: (Genero)Convert.ToChar(dr["Genero"]),
                foto: foto!=DBNull.Value? ((byte[])foto).toBitMap() : null,
                alias: dr["ALIAS"].ToString(),
                nombreUsuario: dr["NombreUsuario"].ToString(),
                rol: rol,
                nacionalidad: dr["NombrePais"].ToString(),
                discripcionTipoId: dr["DescTipoID"].ToString(),
                estado: (EstadoUsuario)Convert.ToChar(dr["Estado"]),
                listaCorreos: new Lazy<IList<CorreoElectronico>>(() =>
                {
                    return CorreoElectronicoRepository.correosDeUsuario(id);
                }),
                listaTelefonos: new Lazy<IList<Telefono>>(() =>
                {
                    return TelefonoUsuarioRepository.telefonosDeUsuario(id);
                }),
                listaReferencias: new Lazy<IList<Referencia>>(() =>
                {
                    return ReferenciaRepository.ReferenciasUsuario(id);
                }),
                horariosDeTrabajo: new Lazy<IList<HorarioDia>>(() => 
                {
                    return DiasHorarioRepository.horarioDiaFuncionario(id);
                })


                );

            return objFuncionario;
        }
    }
}
